package com.base.cn.platform.os.service.manage.config;

import com.base.cn.platform.os.common.constants.CacheConstants;
import com.base.cn.platform.os.common.j2cache.CustomCacheChannel;
import com.base.cn.platform.os.common.j2cache.J2CacheRegion;
import com.base.cn.platform.os.common.mybatis.BaseBiz;
import com.base.cn.platform.os.common.utils.DataUtil;
import com.base.cn.platform.os.common.utils.ObjectUtils;
import com.base.cn.platform.os.common.utils.StringUtils;
import com.base.cn.platform.os.dao.manage.config.SysConfigDao;
import com.base.cn.platform.os.entity.manage.config.SysConfig;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;
import java.util.TreeMap;

/**
 * 配置Biz
 * @author s.li
 * @create 2018-04-09-18:23
 */
@Service
public class SysConfigBiz extends BaseBiz<SysConfig,SysConfigDao> {
    private Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
    @Autowired
    private CustomCacheChannel customCacheChannel;
    /**
     * 通过类型标识，获取配置内容
     * @param configKey
     * @return 配置内容
     */
    public TreeMap<String, String> getSysConfigContext(String configKey) {
        if (StringUtils.isNotEmpty(configKey)) {
            TreeMap<String, String> contextMap = (TreeMap<String, String>)customCacheChannel.get(J2CacheRegion.SEVEN_DAY_REGION.getKey(),CacheConstants.CONFIG_KEY_PREFIX+configKey).getValue();
            if(ObjectUtils.isEmpty(contextMap)){
                SysConfig sysConfig = this.findOne( " configType='" + configKey.trim()+"'",null);
                if (ObjectUtils.isNotEmpty(sysConfig)) {
                    TreeMap<String,String> resultMap = this.contextToMap(sysConfig.getContext());
                    customCacheChannel.set(J2CacheRegion.SEVEN_DAY_REGION.getKey(),CacheConstants.CONFIG_KEY_PREFIX+configKey,resultMap);
                    return resultMap;
                }
            }
            return contextMap;
        }
        return null;
    }

    /**
     * 查询配置数据列表
     * @param sysConfig
     * @return
     */
    public List<SysConfig> querySysConfigList(SysConfig sysConfig) {
        String whereSql = " 1=1";
        if (ObjectUtils.isNotEmpty(sysConfig)) {
            if (StringUtils.isNotEmpty(sysConfig.getConfigName())) {
                whereSql += " and configName like concat('%','" + sysConfig.getConfigName().trim() + "','%')";
            }
        }
        return this.find(whereSql,null,null);
    }
    /**
     * 通过ID，获取配置内容
     * @param id 配置ID
     * @return 配置对象
     */
    public SysConfig getSysConfigById(BigDecimal id) {
        if (DataUtil.idIsNotNull(id)) {
            SysConfig sysConfig = this.findById(id);
            if (ObjectUtils.isNotEmpty(sysConfig)) {
                TreeMap<String, String> contextTreeMap = this.contextToMap(sysConfig.getContext());
                sysConfig.setContextTreeMap(contextTreeMap);
            }
            return sysConfig;
        }
        return null;
    }
    /**
     * 保存配置数据
     * @param sysConfig 配置数据对象
     * @return SysConfig
     */
    public SysConfig saveConfig(SysConfig sysConfig){
        if(DataUtil.idIsNotNull(sysConfig.getId())){//修改
            this.updateById(sysConfig,null);
        }else{//添加
            this.save(sysConfig);
        }
        //删除缓存
        customCacheChannel.evict(J2CacheRegion.SEVEN_DAY_REGION.getKey(),CacheConstants.CONFIG_KEY_PREFIX+sysConfig.getConfigType());
        return sysConfig;
    }

    /**
     * 把配置内容转成TreeMap
     *
     * @param context 配置内容
     * @return TreeMap<String                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               ,                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               String>
     */
    public TreeMap<String, String> contextToMap(String context) {
        if (StringUtils.isNotEmpty(context)) {
            return gson.fromJson(context, new TypeToken<TreeMap<String, String>>() {}.getType());
        }
        return null;
    }

    /**
     * 通过 配置类型获取对象
     * @return 配置对象
     */
    public SysConfig getSysConfigByConfigType(String  configType) {
        if (StringUtils.isNotEmpty(configType)) {
            SysConfig sysConfig = this.findOne(" configType= '"+configType+"'",null);
            if (ObjectUtils.isNotEmpty(sysConfig)) {
                TreeMap<String, String> contextTreeMap = this.contextToMap(sysConfig.getContext());
                sysConfig.setContextTreeMap(contextTreeMap);
            }
            return sysConfig;
        }
        return null;
    }
}
